package com.chen;

import java.io.IOException;
import java.util.logging.*;

public class LibraryLog {
    private static final Logger logger = Logger.getLogger(LibraryLog.class.getName());

    static {
        try {
            // 关闭默认处理器
            logger.setUseParentHandlers(false);
            // 设置日志级别
            logger.setLevel(Level.ALL);

            // 创建控制台处理器
//            ConsoleHandler consoleHandler = new ConsoleHandler();
//            consoleHandler.setLevel(Level.ALL);
//            consoleHandler.setFormatter(new SimpleFormatter());
//            logger.addHandler(consoleHandler);


            // 创建文件处理器
            FileHandler fileHandler = new FileHandler("library-system/src/com/chen/library.log", true);
            fileHandler.setLevel(Level.ALL);
            fileHandler.setFormatter(new Formatter() {
                @Override
                public String format(LogRecord record) {
                    // 获取时间
                    String timestamp = LocalDateTimeUtil.getDateTime();
                    // 获取日志级别
                    String level = record.getLevel().getName();
                    // 获取类名和方法名（如果存在）
                    String className = record.getSourceClassName();
                    String methodName = record.getSourceMethodName();
                    // 获取消息
                    String message = record.getMessage();

                    return String.format("[%s] [%s] [%s.%s] %s%n", timestamp, level, className, methodName, message);
                }
            });
            logger.addHandler(fileHandler);
        } catch (IOException e) {
            System.out.println("日志文件创建失败:" + e.getMessage());
        }
    }

    /**
     * 记录指定级别的日志
     *
     * @param level   日志级别
     * @param message 日志消息
     */
    public static void log(Level level, String message) {
        // 手动填充类名和方法名
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        // 缺陷就是无法获知此时运行的类与方法
        //String className = stackTrace[3].getClassName();
        //String methodName = stackTrace[3].getMethodName();

        LogRecord record = new LogRecord(level, message);
        //record.setSourceClassName(className);
        //record.setSourceMethodName(methodName);
        logger.log(record);
    }
}
